﻿using System.Collections.Generic;
using System.Linq;
using System.Windows.Input;
using DG.Common.EF.WPF;
using DG.Common.Patterns.Commands;
using DG.Common.Patterns.MVVM;
using TCC.ControleFluxoDeCaixa.Apresentacao.Views;
using TCC.ControleFluxoDeCaixa.Model.Entities;
using TCC.ControleFluxoDeCaixa.Model.Fluxo;

namespace TCC.ControleFluxoDeCaixa.Apresentacao.ViewModels
{
    public class LancamentoListaWindowViewModel : ViewModelBase
    {
        public  readonly FluxoDeCaixaContextFiltrado Context = FluxoContextFactory.GetInstance().Create();
        private Lancamento _selectedLancamento;

        public IEnumerable<Lancamento> Lancamentos
        {
            get
            {
                return Context.Lancamentos.ToArray();
            }
        }

        public Lancamento SelectedLancamento
        {
            get { return _selectedLancamento; }
            set { _selectedLancamento = value; OnPropertyChanged("SelectedLancamento"); }
        }

        public ICommand Incluir
        {
            get
            {
                return new FunctionalCommand(() => LancamentoCadastroWindow.Inserir(s =>
                {
                    if (s.Resultado == ResultadoDoFormulario.Salvo) OnPropertyChanged("Lancamentos");
                }));
            }
        }
        public ICommand Modificar
        {
            get
            {
                return new FunctionalCommand(() => LancamentoCadastroWindow.Modificar(SelectedLancamento, s =>
                {
                    if (s.Resultado == ResultadoDoFormulario.Salvo) OnPropertyChanged("Lancamentos");
                }), ()=> SelectedLancamento != null);
            }
        }
        public ICommand Visualizar
        {
            get
            {
                return new FunctionalCommand(() => LancamentoCadastroWindow.Modificar(SelectedLancamento, null), () => SelectedLancamento != null);
            }
        }
        public ICommand Deletar
        {
            get
            {
                return new FunctionalCommand(() =>
                {
                    Context.Lancamentos.Remove(SelectedLancamento);
                    Context.SaveChanges();
                    SelectedLancamento = null;
                    OnPropertyChanged("Lancamentos");
                }
                    , () => SelectedLancamento != null);
            }
        }
    }
}